﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using vudu.Presentacion.Contrato.VU_16_Gestionar_Estudiante;
using vudu.Logica.Fachada;
using vudu.ClasesDominio;
using System.Text.RegularExpressions;

namespace vudu.Presentacion.Presentador.VU_16_Gestionar_Estudiante
{
    public class PresentadorAgregarEstudiante
    {

        //Variables para definir la vista y la fachada
        private IContratoAgregarEstudiante _vista;
        private EnlaceLogico _fachada;

        #region Variables y constantes;

        private System.Drawing.Color _colorMensajeError = System.Drawing.Color.Red;
        private System.Drawing.Color _colorMensajeExitoso = System.Drawing.Color.Green;
        private System.Drawing.Color _colorLabelBase = System.Drawing.Color.Black;
        private string nacionalidad;
        private int cedula;
        private string nombre ,apellido, numExpediente;
        private DateTime fecha;
        private string correo, telefonoCompleto, sexo;
        private int _longitudExpediente = 7;
        private int _longitudTelefono = 7;
        private int _longitudCodigo = 4;
        private int _longMinCedula = 7;
        private int _longMaxCedula = 8;
        private int num = 0;
        private Escuela escuela;
        private string transaccionFallida = "transaccionFallida";
        private string transaccionExitosa = "transaccionExitosa";
        private string operacionFallidaExp = "Operación Fallida: Ya Existe ese Expediente";
        private string agregadoExito = "El Estudiante se Agrego con Exito ";
        private string operacionFallida = "Operación Fallida";
        private string operacionFallidaEst = "Operación Fallida: El Estudiante ya esta Registrado";
        #endregion

        //Inicio la vista y la fachada
        public PresentadorAgregarEstudiante(IContratoAgregarEstudiante vista,EnlaceLogico fachada)
        {
            _vista = vista;
            _fachada = fachada;
            escuela = (Escuela)fachada.RolActual;

        }

        //Inicializo lo que saldra por pantalla, los labes de los mensajes
        public void InicioPantalla()
        {
            _vista.bienvenida.Text = "Agregar Estudiante";
            _vista.escuelaNombre.Text = escuela.NombreEscuela;
            _vista.errorObli1.Visible = false;
            _vista.errorObli2.Visible = false;
            _vista.errorObli3.Visible = false;
            _vista.errorObli4.Visible = false;
            _vista.errorObli5.Visible = false;
            _vista.errorObli6.Visible = false;
            _vista.errorObli7.Visible = false;
            _vista.errorObli8.Visible = false;
        }

        //Procedimiento para vaciar los textbox de la vista
        public void VaciarCampos()
        {
            _vista.cedulanum.Text = _vista.exp.Text = _vista.nombre.Text = "";
            _vista.apellido.Text = _vista.nac.Text = _vista.correo.Text = "";
            _vista.telf.Text = "";
            _vista.codigo.Text = "";
        }

        public void CambiarColor()
        {

            _vista.uxCi.ForeColor = _vista.uxExpediente.ForeColor = _vista.uxNombre.ForeColor = _colorLabelBase;
            _vista.uxApellido.ForeColor = _vista.uxFecha.ForeColor = _vista.uxCorreo.ForeColor = _colorLabelBase;
            _vista.uxTelefono.ForeColor = _colorLabelBase;
        }

        /// <summary>
        /// Funcion que valida si la cedula es correcta.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidaCedula(string cedula)
        {
            bool esValido = false;
            esValido = int.TryParse(cedula, out num);
            if (!esValido)  /// solo numeros
            {
                _vista.uxCi.ForeColor = _colorMensajeError;
                return false;
            }
            else if ((cedula.Length < _longMinCedula) || (cedula.Length > _longMaxCedula))  /// mayor que 7 y menor que 8
            {
                _vista.uxCi.ForeColor = _colorMensajeError;
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// Funcion que valida el tamaño del numero de expediente.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidaLongitudExpediente(string expediente)
        {
            bool esValido = false;
            esValido = int.TryParse(expediente, out num);
            if (!esValido)  /// solo numeros
            {
                _vista.uxExpediente.ForeColor = _colorMensajeError;
                return false;
            }
            else if ((expediente.Length > _longitudExpediente))  /// mayor que 7 y menor que 8
            {
                _vista.uxExpediente.ForeColor = _colorMensajeError;
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// Funcion que Valida el correo introducido.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es correcto, false caso contrario.</returns>
        public bool ValidaCorreo(string correo)
        {
            Regex regex = new Regex(@"\W");
            Regex rege = new Regex(@"\s");


            if ((rege.IsMatch(correo)) || (regex.IsMatch(correo)))  /// valida que no tenga caracteres especiales
            {
                _vista.uxCorreo.ForeColor = _colorMensajeError;
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// Funcion que Valida si los Textbox se encuentran seleccionados y si cumplen con sus formatos.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es correcto, false caso contrario.</returns>
        public bool ValidarCampos()
        {
            bool val1 = true;
            bool val2 = true;
            bool val3 = true;
            bool val4 = true;
            bool val5 = true;
            bool val6 = true;
            bool val7 = true;
            bool val8 = true;

            val1 = this.ValidaCedula(_vista.cedulanum.Text);
            val5 = this.ValidarCampoFecha();
            val6 = this.ValidarCampoTelefono();
            val7 = this.ValidaLongitudExpediente(_vista.exp.Text);
            val8 = this.ValidarExpediente(_vista.exp.Text, escuela.IdEscuela);
            if (_vista.cedulanum.Text == "")  /// Valida si el campo de la cedula es vacio
            {
                _vista.uxCi.ForeColor = _colorMensajeError;
                val1 = false;
            }
            if (_vista.correo.Text == "")    /// Valida si el campo del mail es vacio
            {
                _vista.uxCorreo.ForeColor = _colorMensajeError;
                val2 = false;
            }
            if(_vista.nombre.Text == "") /// Valida si el campo nombre es vacio
            {
                _vista.uxNombre.ForeColor = _colorMensajeError;
                val3 = false;
            }
            if (_vista.apellido.Text == "")/// valida si el campo apellido es vacio
            {
                _vista.uxApellido.ForeColor = _colorMensajeError;
                val4 = false;
            }
            if (_vista.telf.Text == "")/// valida si el campo telefono es vacio
            {
                _vista.uxTelefono.ForeColor = _colorMensajeError;
                val6 = false;
            }                           
            if(_vista.exp.Text == "")/// valida si el campo expediente es vacio
            {
                _vista.uxExpediente.ForeColor = _colorMensajeError;
                val7 = false;
            }
            if (val8 == true)
            {
                _vista.estados.Text = operacionFallidaExp;
                _vista.estados.CssClass = transaccionFallida;
                _vista.estados.Visible = true;
                _vista.uxExpediente.ForeColor = _colorMensajeError;
            }
            if ((val1 == true) && (val2 == true) &&(val3 == true)
                &&(val4 == true) && (val5 == true) && (val6 == true) && (val7 == true) && (val8 == false))
                return true;
            else
                return false;
        }


        /// <summary>
        /// Funcion que Valida si lo introducido es una fecha.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es fecha, false caso contrario.</returns>
        public bool ValidarCampoFecha()
        {
            if (_vista.nac.Text.Length == 0)
            {
                _vista.uxFecha.ForeColor = _colorMensajeError;
                return false;
            }
            else if (!ValidarSiEsFecha(_vista.nac.Text))
            {
                _vista.uxFecha.ForeColor = _colorMensajeError;
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// Funcion que Valida si lo introducido es una fecha.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es fecha, false caso contrario.</returns>
        public bool ValidarSiEsFecha(string fecha)
        {
            try
            {
                Convert.ToDateTime(fecha);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        /// <summary>
        /// Procedimiento para agregar un Estudiante.
        /// </summary>
        /// <param name="numero"></param>
        public void AgregarEstudiante()
        {
            this.CambiarColor();
            if ((this.ValidarCampos() == true))
            {
                nacionalidad = _vista.ci.SelectedItem.Text;
                cedula = int.Parse(_vista.cedulanum.Text);
                nombre = _vista.nombre.Text;
                apellido = _vista.apellido.Text;
                numExpediente = _vista.exp.Text;
                sexo = _vista.sex.SelectedItem.Text;
                correo = _vista.correo.Text;
                telefonoCompleto = "(" + _vista.codigo.Text + ")" + _vista.telf.Text;


                if (_fachada.verificarCedulaEstudianteAgregar(cedula) == false)
                {
                    fecha = Convert.ToDateTime(_vista.nac.Text);
                    if ((_fachada.AgregarEstudianteEnSistema(nombre, apellido, sexo, cedula, numExpediente,
                        fecha, correo, telefonoCompleto, nacionalidad, escuela.IdEscuela)) == true)
                    {
                        this.VaciarCampos();
                        _vista.estados.Text = agregadoExito;
                        _vista.estados.CssClass = transaccionExitosa;
                        _vista.estados.Visible = true;
                    }
                }
                else
                {
                    _vista.estados.Text = operacionFallidaEst;
                    _vista.estados.CssClass = transaccionFallida;
                    _vista.estados.Visible = true;
                    _vista.uxCi.ForeColor = _colorMensajeError;
                }
            }
            else
            {

                _vista.estados.Text = operacionFallida;
                _vista.estados.CssClass = transaccionFallida;
                _vista.estados.Visible = true;
            }
            
            
            
        }

        /// <summary>
        /// Funcion que valida si la informacion de Campo telefono y codigo es correcta.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarCampoTelefono()
        {
            bool validacion = true;

            if ((_vista.telf.Text.Length < _longitudTelefono) || (_vista.codigo.Text.Length < _longitudCodigo))
            {
                validacion = validacion && false;
            }
            validacion = validacion && ValidarSiEsNumero(_vista.telf.Text);
            validacion = validacion && ValidarSiEsNumero(_vista.codigo.Text);

            if (validacion)
            {
                return true;
            }
            else
            {
                _vista.uxTelefono.ForeColor = _colorMensajeError;
                return false;
            }
        }

        /// <summary>
        /// Funcion que valida si exite un numero de expediente igual en la escuela.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarExpediente(string expediente, int escuela)
        {
            return _fachada.verificarExpedienteEstudianteAgregar(expediente,escuela);
        }

        /// <summary>
        /// Funcion que valida si el valor es un numero
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarSiEsNumero(string numero)
        {
            try
            {
                Convert.ToInt32(numero);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }


    }
}